/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package colloque.forms;


import colloque.Colloque;
import colloque.Expose;
import colloque.HibernateUtil;
import colloque.Institution;
import colloque.MotCle;
import colloque.Utilisateur;
import colloque.helpers.UtilisateurHelper;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import org.hibernate.HibernateException;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author James
 */
public class ExposeForm {
    
    Session session = null;

    /**
     *
     */
    public ExposeForm() {
        this.session = HibernateUtil.getSessionFactory().getCurrentSession();
    }

    private Map<String, String> erreurs      = new HashMap<String, String>();

    /**
     *
     * @return
     */
    public Map<String, String> getErreurs() {
        return erreurs;
    }

    /**
     * Définit les utilisateurs qui évalueront un Exposé
     * 
     * @param request
     * @throws Exception
     */
    public void setUtilisateurs(HttpServletRequest request) throws Exception  {
        /* Récupération des champs du formulaire */
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            Expose expose = (Expose) session.get(Expose.class, Integer.parseInt(request.getParameter("expose_id")));
            String[] utilisateur = request.getParameterValues("utilisateur");
            // La liste des mot cles choisis
            List<String> utilisateurs_list = Arrays.asList(utilisateur);
            Set<Utilisateur> utilisateurs = new HashSet<Utilisateur>();
            for (int i = 0; i < utilisateurs_list.size(); i++) {
                utilisateurs.add((Utilisateur) session.get(Utilisateur.class, Integer.parseInt(utilisateurs_list.get(i))));
            }
            String sql = "DELETE FROM EST_AFFECTE_A WHERE EXPOSEID = "+ expose.getExposeid();
            SQLQuery query = session.createSQLQuery(sql);
            query.executeUpdate();
            expose.setUtilisateurs(utilisateurs);
            session.save(expose);
            tx.commit();
        } catch (HibernateException e) {
            if (tx != null) {
                tx.rollback();
            }
            e.printStackTrace();
        }
    }

    /**
     * Créée un exposé lorque l'utilisateur est authentifié
     * 
     * @param request
     * @return
     * @throws Exception
     */
    public Expose creerExposeConnecte(HttpServletRequest request) throws Exception {
        Expose oexpo = new Expose();
        try {
            Transaction tx = session.beginTransaction();
            String colloqueid = request.getParameter("colloqueid");
            String resume = request.getParameter("resume");
            String[] mc = request.getParameterValues("mc1");
            // La liste des mot cles choisis
            List<String> lmc = Arrays.asList(mc);
            Set<MotCle> motcles = new HashSet<MotCle>();
            for (int i = 0; i < lmc.size(); i++) {
                motcles.add((MotCle) session.get(MotCle.class, Integer.parseInt(lmc.get(i))));
            }
            // recuper l'objet colloque
            Colloque ocol = (Colloque) session.get(Colloque.class, Integer.parseInt(colloqueid));
            // creer l'objet user
            UtilisateurHelper utilisateurhelper = new UtilisateurHelper();
            Utilisateur ouser = utilisateurhelper.getUtilisateurCourant(request);
            oexpo.setColloque(ocol);
            oexpo.setMotCles(motcles);
            oexpo.setExposeresume(resume);
            oexpo.setExposeetat(0);
            oexpo.setUtilisateur(ouser);
            session.save(oexpo);
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            return oexpo;
        }

    }

    
    /**
     * Créée un exposé pour un utilisateur non inscrit
     * 
     * @param request
     * @return
     * @throws Exception
     */
    public Expose creerExposeAnonyme(HttpServletRequest request) throws Exception {
        Expose oexpo = new Expose();
        try {
            Transaction tx = session.beginTransaction();
            String nom = request.getParameter("nom");
            String prenom = request.getParameter("prenom");
            String mail = request.getParameter("adrmail");
            String institutionid = request.getParameter("institutionid");
            String password = request.getParameter("motpasse");
            String colloqueid = request.getParameter("colloqueid");
            String resume = request.getParameter("resume");
            String[] mc = request.getParameterValues("mc1");
            // La liste des mot cles choisis
            List<String> lmc = Arrays.asList(mc);
            Set<MotCle> motcles = new HashSet<MotCle>();
            for (int i = 0; i < lmc.size(); i++) {
                motcles.add((MotCle) session.get(MotCle.class, Integer.parseInt(lmc.get(i))));
            }
            Colloque ocol = (Colloque) session.get(Colloque.class, Integer.parseInt(colloqueid));
            Institution oinstit = (Institution) session.get(Institution.class, Integer.parseInt(institutionid));
            Utilisateur ouser = new Utilisateur(nom, prenom, mail, password, oinstit);
            oexpo.setColloque(ocol);
            oexpo.setMotCles(motcles);
            oexpo.setExposeresume(resume);
            oexpo.setUtilisateur(ouser);
            oexpo.setExposeetat(0);
            session.save(ouser);
            session.save(oexpo);
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            return oexpo;
        }
    }

    

    
    
    /*
     * Ajoute un message correspondant au champ spécifié à la map des erreurs.
     */
    private void setErreur( String champ, String message ) {
        erreurs.put( champ, message );
    }

    /*
     * Méthode utilitaire qui retourne null si un champ est vide, et son contenu
     * sinon.
     */
    private static String getValeurChamp( HttpServletRequest request, String nomChamp ) {
        String valeur = request.getParameter( nomChamp );
        if ( valeur == null || valeur.trim().length() == 0 ) {
            return null;
        } else {
            return valeur;
        }
    }
}

